// Copyright (c) 2013, yuno. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
package sugarmintcandy.widgetwindow;

import android.annotation.SuppressLint;
import android.appwidget.AppWidgetHostView;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

@SuppressLint("ViewConstructor")
public class MyAppWidgetHostView extends AppWidgetHostView {
    private int mHostId;
    private Handler mHandler;
    private boolean mLongPressed;
    private boolean mLongClickPerformed;
    private float mDownX;
    private float mDownY;

    public MyAppWidgetHostView(Context context, int hostId) {
	super(context);
	mHostId = hostId;
	mHandler = new Handler(new MyHandlerCallback());
    }

    public int getHostId() {
	return mHostId;
    }

    @Override
    public void setOnLongClickListener(OnLongClickListener l) {
	super.setOnLongClickListener(l);
	setLongClickable(false);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
	int action = ev.getAction();
	if (action == MotionEvent.ACTION_DOWN) {
	    mHandler.removeMessages(R.id.long_press);
	    mHandler.sendEmptyMessageDelayed(R.id.long_press,
		    ViewConfiguration.getLongPressTimeout());
	    mLongPressed = true;
	    mLongClickPerformed = false;
	    mDownX = ev.getX();
	    mDownY = ev.getY();
	}
	if (mLongPressed) {
	    if (action == MotionEvent.ACTION_MOVE) {
		float dx = ev.getX() - mDownX;
		float dy = ev.getY() - mDownY;
		int slop = ViewConfiguration.get(getContext())
			.getScaledTouchSlop();
		if (dx * dx + dy * dy >= slop * slop) {
		    mHandler.removeMessages(R.id.long_press);
		}
	    }
	    if (action == MotionEvent.ACTION_UP
		    || action == MotionEvent.ACTION_CANCEL) {
		mHandler.removeMessages(R.id.long_press);
		mLongClickPerformed = false;
		mLongPressed = false;
	    }
	    if (mLongClickPerformed) {
		return true;
	    }
	}
	return super.onInterceptTouchEvent(ev);
    }

    @Override
    public void cancelLongPress() {
	super.cancelLongPress();
	mHandler.removeMessages(R.id.long_press);
    }

    @Override
    protected void onDetachedFromWindow() {
	super.onDetachedFromWindow();
	mHandler.removeMessages(R.id.long_press);
    }

    private class MyHandlerCallback implements Handler.Callback {
	@Override
	public boolean handleMessage(Message msg) {
	    if (msg.what == R.id.long_press) {
		if (performLongClick()) {
		    mLongClickPerformed = true;
		    setPressed(false);
		}
	    }
	    return true;
	}
    }
}
